package com.cs.beneficios.business.entity;

import com.cs.beneficios.business.model.ProgramaVO;
import com.cs.beneficios.business.model.SubProgramaVO;
import com.cs.beneficios.common.ConnectionFactory;

import com.cs.beneficios.web.form.SubprogramaForm;

//import com.cs.paoyer.administration.business.model.UserVO;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;

import java.sql.Types;

import java.util.ArrayList;
import java.util.Collection;

public class SubProgramaDAO {
	/**
	 * Conexion a la base de datos.
	 */
	private Connection conn = null;
	private ConnectionFactory cf;

	/**
	 * Constructor que inicializa la conexion con la base de datos.
	 * 
	 * @param conn
	 *            Conexion con la base de datos.
	 */

	public SubProgramaDAO(ConnectionFactory cf) {
		this.cf = cf;
		try {
			this.conn = this.cf.getConnection();
		} catch (SQLException e) {
		}
	}

	public Collection findSubProgramaByCriterea(SubProgramaVO criterea)
			throws SQLException {
		String query = "SELECT subpro.CODIGO,subpro.NOMBRE, subpro.DESCRIPCION, "
				+ "subpro.DIAS_REUTILIZAR, subpro.GRUPO_FAMILIAR, subpro.VALIDAR_CONTRA_ESTUD, "
				+ "subpro.VALIDAR_CONTRA_SISBEN, subpro.DIRECCION_BEN_OBLIGATORIA, nvl(subpro.VALOR_UNITARIO_BENEFICIO,0) VALOR_UNITARIO_BENEFICIO, "
				+ "subpro.DESDE_VIGENCIA, subpro.HASTA_VIGENCIA, subpro.VIGENCIA, pro.CODIGO COD_PROGRAMA, "
				+ "pro.NOMBRE NOM_PROGRAMA, usu.CODIGO COD_USUARIO, usu.NOMBRE NOM_USUARIO, "
				+ "vflex.CODIGO COD_CATEGORIA, vflex.DESCRIPCION NOM_CATEGORIA "
				+ "FROM TCS_BEN_SUBPROGRAMA subpro, "
				+ "TCS_BEN_PROGRAMA pro, "
				+ "paoyer.TCS_USUARIO usu, "
				+ "paoyer.TCS_VALOR_FLEXIBLE vflex "
				+ "WHERE subpro.PRG_CODIGO = pro.CODIGO "
				+ "AND subpro.USU_CODIGO = usu.CODIGO "
				+ "AND vflex.CODIGO (+)= subpro.VFL_CODIGO_CATEGORIA ";

		if (criterea.getCode() != null) {
			query += "AND subpro.CODIGO = " + criterea.getCode() + " ";
		}
		if (!criterea.getNombre().equalsIgnoreCase("")) {
			query += "AND subpro.NOMBRE LIKE '%"
					+ criterea.getNombre().toUpperCase().trim() + "%' ";
		}
		if (criterea.getCodePrograma() != null) {
			query += "AND pro.CODIGO = " + criterea.getCodePrograma() + " ";
		}

		query += " ORDER BY subpro.NOMBRE";
		System.err.println(query);
		ResultSet rst = null;
		ArrayList subprogramas = new ArrayList();
		rst = cf.getRecordsRset(query, null, conn);
		SubProgramaVO subpro = null;
		while (rst.next()) {
			subpro = new SubProgramaVO();
			subpro.setCode(new Long(rst.getLong("CODIGO")));
			subpro.setNombre(rst.getString("NOMBRE"));
			subpro.setDescripcion(rst.getString("DESCRIPCION"));
			subpro.setDiasReutilizar(rst.getString("DIAS_REUTILIZAR"));
			subpro.setGrupoFamiliar(rst.getString("GRUPO_FAMILIAR"));
			subpro.setValidarEstud(rst.getString("VALIDAR_CONTRA_ESTUD"));
			subpro.setValidarSisben(rst.getString("VALIDAR_CONTRA_SISBEN"));
			subpro.setDirBenObligatoria(rst
					.getString("DIRECCION_BEN_OBLIGATORIA"));
			subpro.setValorUnitarioBeneficio(rst
					.getString("VALOR_UNITARIO_BENEFICIO"));
			subpro.setDesdeVigencia(rst.getString("DESDE_VIGENCIA"));
			subpro.setHastaVigencia(rst.getString("HASTA_VIGENCIA"));
			subpro.setVigencia(rst.getString("VIGENCIA"));
			subpro.setCodePrograma(new Long(rst.getLong("COD_PROGRAMA")));
			subpro.setNombrePrograma(rst.getString("NOM_PROGRAMA"));
			subpro.setCodeUsuario(new Long(rst.getLong("COD_USUARIO")));
			subpro.setNombreUsuario(rst.getString("NOM_USUARIO"));
			subpro.setCodeCategoria(new Long(rst.getLong("COD_CATEGORIA")));
			subpro.setDescCategoria(rst.getString("NOM_CATEGORIA"));
			subprogramas.add(subpro);
			subpro = null;
		}
		rst.close();
		return subprogramas;
	}

	public Collection findTotalInformation(SubProgramaVO criterea)
			throws SQLException {
		String query = "SELECT subpro.CODIGO,subpro.NOMBRE, subpro.DESCRIPCION, "
				+ "subpro.DIAS_REUTILIZAR, subpro.CAMPO_A3 DIAS_RENOVAR, subpro.GRUPO_FAMILIAR, subpro.VALIDAR_CONTRA_ESTUD, "
				+ "subpro.VALIDAR_CONTRA_SISBEN, subpro.DIRECCION_BEN_OBLIGATORIA, nvl(subpro.VALOR_UNITARIO_BENEFICIO,0) VALOR_UNITARIO_BENEFICIO, "
				+ "TO_CHAR(subpro.DESDE_VIGENCIA,'dd/mm/rrrr')DESDE_VIGENCIA, "
				+ "TO_CHAR(subpro.HASTA_VIGENCIA,'dd/mm/rrrr')HASTA_VIGENCIA , subpro.VIGENCIA, "
				+ "subpro.AREA_CODIGO, area.NOMBRE NOM_AREA, subpro.COMENTARIO, "
				+ "pro.CODIGO COD_PROGRAMA, "
				+ "pro.NOMBRE NOM_PROGRAMA, usu.CODIGO COD_USUARIO, usu.NOMBRE NOM_USUARIO, "
				+ "vflex.CODIGO COD_CATEGORIA, vflex.DESCRIPCION NOM_CATEGORIA "
				+ "FROM TCS_BEN_SUBPROGRAMA subpro, "
				+ "TCS_BEN_PROGRAMA pro, TCS_BEN_AREA area, "
				+ "paoyer.TCS_USUARIO usu, "
				+ "paoyer.TCS_VALOR_FLEXIBLE vflex "
				+ "WHERE subpro.PRG_CODIGO = pro.CODIGO "
				+ "AND subpro.USU_CODIGO = usu.CODIGO "
				+ "AND area.CODIGO = subpro.AREA_CODIGO "
				+ "AND vflex.CODIGO (+)= subpro.VFL_CODIGO_CATEGORIA ";

		if (criterea.getCode() != null) {
			query += "AND subpro.CODIGO = " + criterea.getCode() + " ";
		}
		if (!criterea.getNombre().equalsIgnoreCase("")) {
			query += "AND subpro.NOMBRE LIKE '%"
					+ criterea.getNombre().toUpperCase().trim() + "%' ";
		}
		if (criterea.getCodePrograma() != null) {
			query += "AND pro.CODIGO = " + criterea.getCodePrograma() + " ";
		}

		query += " ORDER BY subpro.NOMBRE";
		// System.out.println(query);
		ResultSet rst = null;
		ArrayList subprogramas = new ArrayList();
		rst = cf.getRecordsRset(query, null, conn);
		SubProgramaVO subpro = null;
		while (rst.next()) {
			subpro = new SubProgramaVO();
			subpro.setCode(new Long(rst.getLong("CODIGO")));
			subpro.setNombre(rst.getString("NOMBRE"));
			subpro.setDescripcion(rst.getString("DESCRIPCION"));
			subpro.setDiasReutilizar(rst.getString("DIAS_REUTILIZAR"));
			subpro.setDiasRenovacion(rst.getString("DIAS_RENOVAR"));
			subpro.setGrupoFamiliar(rst.getString("GRUPO_FAMILIAR"));
			subpro.setValidarEstud(rst.getString("VALIDAR_CONTRA_ESTUD"));
			subpro.setValidarSisben(rst.getString("VALIDAR_CONTRA_SISBEN"));
			subpro.setDirBenObligatoria(rst
					.getString("DIRECCION_BEN_OBLIGATORIA"));
			subpro.setValorUnitarioBeneficio(rst
					.getString("VALOR_UNITARIO_BENEFICIO"));
			subpro.setDesdeVigencia(rst.getString("DESDE_VIGENCIA"));
			subpro.setHastaVigencia(rst.getString("HASTA_VIGENCIA"));
			subpro.setVigencia(rst.getString("VIGENCIA"));
			subpro.setCodePrograma(new Long(rst.getLong("COD_PROGRAMA")));
			subpro.setNombrePrograma(rst.getString("NOM_PROGRAMA"));
			subpro.setCodeUsuario(new Long(rst.getLong("COD_USUARIO")));
			subpro.setNombreUsuario(rst.getString("NOM_USUARIO"));
			subpro.setCodeCategoria(new Long(rst.getLong("COD_CATEGORIA")));
			subpro.setDescCategoria(rst.getString("NOM_CATEGORIA"));
			subpro.setCodeArea(new Long(rst.getLong("AREA_CODIGO")));
			subpro.setNombreArea(rst.getString("NOM_AREA"));
			subpro.setComentario(rst.getString("COMENTARIO"));

			subprogramas.add(subpro);
			subpro = null;
		}
		rst.close();
		return subprogramas;
	}

	/**
	 * 
	 * @param criterea
	 *            bean with all data to filter the query.
	 * @param codeUser
	 *            code of the user at the moment connected
	 * @param groupUserName
	 *            Name of the user group
	 * @param areaUser
	 *            Code of the area to which the user belongs
	 * @notes This method returns all the subprograms to which a user has
	 *        permission, as long as they are associate to a seat
	 * @author Carlos Ruiz & Daniel Monsalve
	 * @date 04/05/2007
	 * @return Collection with the subprograms
	 * @throws java.sql.SQLException
	 */

	public Collection findSubProgramaByCriterea(SubProgramaVO criterea,
			Long codeUser, String groupUserName, Long areaUser)
			throws SQLException {
		String query = "select DISTINCT CODIGO,NOMBRE,DESCRIPCION,DIAS_REUTILIZAR,GRUPO_FAMILIAR, "
				+ "VALIDAR_CONTRA_ESTUD,VALIDAR_CONTRA_SISBEN,DIRECCION_BEN_OBLIGATORIA,nvl(VALOR_UNITARIO_BENEFICIO,0) VALOR_UNITARIO_BENEFICIO, "
				+ "DESDE_VIGENCIA,HASTA_VIGENCIA,VIGENCIA,COD_PROGRAMA, NOM_PROGRAMA,"
				+ "COD_USUARIO,NOM_USUARIO,COD_CATEGORIA, NOM_CATEGORIA "
				+ "from VCS_BEN_SUBPROGRAMAS ";

		if ((Object) codeUser != null) {
			query += " where (ususede = " + codeUser
					+ " OR 'ADMINISTRADOR GENERAL' = '" + groupUserName
					+ "' OR 'SUPER USUARIO' = '" + groupUserName
					+ "' or admSubpro = " + codeUser
					+ "          or admProg = " + codeUser;
			if (groupUserName != null
					&& groupUserName.equals("ADMINISTRADOR SECRETARIA")) {
				query += " or AREA_CODIGO = " + areaUser;
			}
			query += " ) ";
		} else
			return null;

		if (criterea.getCode() != null) {
			query += " AND CODIGO = " + criterea.getCode() + " ";
		}
		if (!criterea.getNombre().equalsIgnoreCase("")) {
			query += " AND NOMBRE LIKE '%"
					+ criterea.getNombre().toUpperCase().trim() + "%' ";
		}
		if (criterea.getCodePrograma() != null
				&& criterea.getCodePrograma().longValue() != 0) {
			query += " AND COD_PROGRAMA = " + criterea.getCodePrograma() + " ";
		}
		if (criterea.getCodeArea() != null) {
			query += " AND AREA_CODIGO = " + criterea.getCodeArea() + " ";
		}
		query += "ORDER BY NOMBRE";

		// System.out.println(query);
		ResultSet rst = null;
		ArrayList subprogramas = new ArrayList();
		rst = cf.getRecordsRset(query, null, conn);
		SubProgramaVO subpro = null;
		while (rst.next()) {
			subpro = new SubProgramaVO();
			subpro.setCode(new Long(rst.getLong("CODIGO")));
			subpro.setNombre(rst.getString("NOMBRE"));
			subpro.setDescripcion(rst.getString("DESCRIPCION"));
			subpro.setDiasReutilizar(rst.getString("DIAS_REUTILIZAR"));
			subpro.setGrupoFamiliar(rst.getString("GRUPO_FAMILIAR"));
			subpro.setValidarEstud(rst.getString("VALIDAR_CONTRA_ESTUD"));
			subpro.setValidarSisben(rst.getString("VALIDAR_CONTRA_SISBEN"));
			subpro.setDirBenObligatoria(rst
					.getString("DIRECCION_BEN_OBLIGATORIA"));
			subpro.setValorUnitarioBeneficio(rst
					.getString("VALOR_UNITARIO_BENEFICIO"));
			subpro.setDesdeVigencia(rst.getString("DESDE_VIGENCIA"));
			subpro.setHastaVigencia(rst.getString("HASTA_VIGENCIA"));
			subpro.setVigencia(rst.getString("VIGENCIA"));
			subpro.setCodePrograma(new Long(rst.getLong("COD_PROGRAMA")));
			subpro.setNombrePrograma(rst.getString("NOM_PROGRAMA"));
			subpro.setCodeUsuario(new Long(rst.getLong("COD_USUARIO")));
			subpro.setNombreUsuario(rst.getString("NOM_USUARIO"));
			subpro.setCodeCategoria(new Long(rst.getLong("COD_CATEGORIA")));
			subpro.setDescCategoria(rst.getString("NOM_CATEGORIA"));
			subprogramas.add(subpro);
			subpro = null;
		}
		rst.close();
		return subprogramas;
	}

	public Collection findAllowedSubProgramaWithGestor(SubProgramaVO criterea,
			Long codeUser, String groupUserName, Long areaUser)
			throws SQLException {
		String query = "SELECT DISTINCT a.CODIGO,  a.NOMBRE,  a.DESCRIPCION, a.DIAS_REUTILIZAR,  "
				+ "a.GRUPO_FAMILIAR, a.VALIDAR_CONTRA_ESTUD,  a.VALIDAR_CONTRA_SISBEN, "
				+ "a.DIRECCION_BEN_OBLIGATORIA, nvl(a.VALOR_UNITARIO_BENEFICIO,0) VALOR_UNITARIO_BENEFICIO, a.DESDE_VIGENCIA, "
				+ "a.HASTA_VIGENCIA, a.VIGENCIA,a.COD_PROGRAMA, a.NOM_PROGRAMA, a.COD_CATEGORIA,  "
				+ "a.NOM_CATEGORIA, a.COD_AREA "
				+ "FROM VCS_BEN_SUBPROG_ALLOWED a, TCS_BEN_SUBP_ATR_BENEFICIARIO sab ";

		if ((Object) codeUser != null) {
			query += " where ( 'ADMINISTRADOR GENERAL' = '" + groupUserName
					+ "' OR 'SUPER USUARIO' = '" + groupUserName
					+ "' or admSubpro = " + codeUser
					+ "          OR admProg = " + codeUser
					+ " OR a.permisos = " + codeUser + " ";
			if (groupUserName != null
					&& groupUserName.equals("ADMINISTRADOR SECRETARIA")) {
				query += " OR a.cod_area = " + areaUser;
			}
			query += " ) ";
		} else
			return null;

		if (criterea.getCode() != null) {
			query += " AND a.CODIGO = " + criterea.getCode() + " ";
		}
		if (!criterea.getNombre().equalsIgnoreCase("")) {
			query += " AND a.NOMBRE LIKE '%"
					+ criterea.getNombre().toUpperCase().trim() + "%' ";
		}
		if (criterea.getCodePrograma() != null) {
			query += " AND a.COD_PROGRAMA = " + criterea.getCodePrograma()
					+ " ";
		}
		if (criterea.getCodeArea() != null) {
			query += " AND (a.cod_area = " + criterea.getCodeArea() + ") ";
		}
		query += " AND a.CODIGO = sab.sbpr_codigo AND UPPER(TRIM(sab.nombre)) = 'GESTOR' ";
		query += " AND a.VIGENCIA = 'A' ORDER BY NOMBRE";

		// System.out.println(query);
		ResultSet rst = null;
		ArrayList subprogramas = new ArrayList();
		rst = cf.getRecordsRset(query, null, conn);
		SubProgramaVO subpro = null;
		while (rst.next()) {
			subpro = new SubProgramaVO();
			subpro.setCode(new Long(rst.getLong("CODIGO")));
			subpro.setNombre(rst.getString("NOMBRE"));
			subpro.setDescripcion(rst.getString("DESCRIPCION"));
			subpro.setDiasReutilizar(rst.getString("DIAS_REUTILIZAR"));
			subpro.setGrupoFamiliar(rst.getString("GRUPO_FAMILIAR"));
			subpro.setValidarEstud(rst.getString("VALIDAR_CONTRA_ESTUD"));
			subpro.setValidarSisben(rst.getString("VALIDAR_CONTRA_SISBEN"));
			subpro.setDirBenObligatoria(rst
					.getString("DIRECCION_BEN_OBLIGATORIA"));
			subpro.setValorUnitarioBeneficio(rst
					.getString("VALOR_UNITARIO_BENEFICIO"));
			subpro.setDesdeVigencia(rst.getString("DESDE_VIGENCIA"));
			subpro.setHastaVigencia(rst.getString("HASTA_VIGENCIA"));
			subpro.setVigencia(rst.getString("VIGENCIA"));
			subpro.setCodePrograma(new Long(rst.getLong("COD_PROGRAMA")));
			subpro.setNombrePrograma(rst.getString("NOM_PROGRAMA"));
			subpro.setCodeCategoria(new Long(rst.getLong("COD_CATEGORIA")));
			subpro.setDescCategoria(rst.getString("NOM_CATEGORIA"));
			subprogramas.add(subpro);
			subpro = null;
		}
		rst.close();
		return subprogramas;
	}

	// Metodo para buscar uno o varios beneficios sin tener en cuenta si estan
	// asociados a una sede
	/**
	 * 
	 * @param criterea
	 *            bean with all data to filter the query.
	 * @param codeUser
	 *            code of the user at the moment connected
	 * @param groupUserName
	 *            Name of the user group
	 * @param areaUser
	 *            Code of the area to which the user belongs
	 * @notes This method returns all the subprograms to which a user has
	 *        permission, as long as they are associate to a seat and enabled.
	 * @author Carlos Ruiz & Daniel Monsalve
	 * @date 04/05/2007
	 * @return Collection with the subprograms
	 * @throws java.sql.SQLException
	 */
	public Collection findSubPrograma(SubProgramaVO criterea, Long codeUser,
			String groupUserName, Long areaUser) throws SQLException {
		String query = "SELECT DISTINCT COD_SUBPRO,  NOM_SUBPRO,  DESC_SUBPRO, FCS_BEN_TIENE_SEDE(COD_SUBPRO) TIENE_SEDE, "
				+ "DREU_SUBPRO,  GRFAM_SUBPRO, VCR_SUBPRO, "
				+ " VCS_SUBPRO, DIROBL_SUBPRO, VALOR_SUBPRO, "
				+ " DESDE_SUBPRO, HASTA_SUBPRO, VIGENCIA_SUBPRO,COD_PROGRAMA, "
				+ "NOM_PROGRAMA, COD_USUARIO, NOM_USUARIO, "
				+ "COD_CATEGORIA,  NOM_CATEGORIA, cod_area, cod_area_prog "
				+ "FROM VCS_BEN_SOLO_SUBPROG_EST_VIG ";

		if ((Object) codeUser != null) {
			query += " where ( 'ADMINISTRADOR GENERAL' = '" + groupUserName
					+ "' OR 'SUPER USUARIO' = '" + groupUserName
					+ "' or admSubpro = " + codeUser
					+ "          or admProg = " + codeUser;
			if (groupUserName != null
					&& groupUserName.equals("ADMINISTRADOR SECRETARIA")) {
				query += " or cod_area_prog = " + areaUser;
			}
			query += " ) ";
		} else
			return null;

		if (criterea.getCode() != null) {
			query += " AND COD_SUBPRO = " + criterea.getCode() + " ";
		}
		if (!criterea.getNombre().equalsIgnoreCase("")) {
			query += " AND NOM_SUBPRO LIKE '%"
					+ criterea.getNombre().toUpperCase().trim() + "%' ";
		}
		if (criterea.getCodePrograma() != null) {
			query += " AND COD_PROGRAMA = " + criterea.getCodePrograma() + " ";
		}
		if (criterea.getCodeArea() != null) {
			query += " AND (cod_area = " + criterea.getCodeArea()
					+ " or cod_area_prog = " + criterea.getCodeArea() + ") ";
		}
		query += " ORDER BY NOM_SUBPRO";

		// System.out.println(query);
		ResultSet rst = null;
		ArrayList subprogramas = new ArrayList();
		rst = cf.getRecordsRset(query, null, conn);
		SubProgramaVO subpro = null;
		while (rst.next()) {
			subpro = new SubProgramaVO();
			subpro.setCode(new Long(rst.getLong("COD_SUBPRO")));
			subpro.setNombre(rst.getString("NOM_SUBPRO"));
			subpro.setDescripcion(rst.getString("DESC_SUBPRO"));
			subpro.setDiasReutilizar(rst.getString("DREU_SUBPRO"));
			subpro.setGrupoFamiliar(rst.getString("GRFAM_SUBPRO"));
			subpro.setValidarEstud(rst.getString("VCR_SUBPRO"));
			subpro.setValidarSisben(rst.getString("VCS_SUBPRO"));
			subpro.setDirBenObligatoria(rst.getString("DIROBL_SUBPRO"));
			subpro.setValorUnitarioBeneficio(rst.getString("VALOR_SUBPRO"));
			subpro.setDesdeVigencia(rst.getString("DESDE_SUBPRO"));
			subpro.setHastaVigencia(rst.getString("HASTA_SUBPRO"));
			subpro.setVigencia(rst.getString("VIGENCIA_SUBPRO"));
			subpro.setCodePrograma(new Long(rst.getLong("COD_PROGRAMA")));
			subpro.setNombrePrograma(rst.getString("NOM_PROGRAMA"));
			subpro.setCodeUsuario(new Long(rst.getLong("COD_USUARIO")));
			subpro.setNombreUsuario(rst.getString("NOM_USUARIO"));
			subpro.setCodeCategoria(new Long(rst.getLong("COD_CATEGORIA")));
			subpro.setDescCategoria(rst.getString("NOM_CATEGORIA"));
			subpro.setTieneSede(rst.getString("TIENE_SEDE"));
			subprogramas.add(subpro);
			subpro = null;
		}
		rst.close();
		return subprogramas;
	}

	/**
	 * 
	 * @param criterea
	 *            bean with all data to filter the query.
	 * @param codeUser
	 *            code of the user at the moment connected
	 * @param groupUserName
	 *            Name of the user group
	 * @param areaUser
	 *            Code of the area to which the user belongs
	 * @notes This method returns all the subprograms to which a user has
	 *        permission.
	 * @author Carlos Ruiz & Daniel Monsalve
	 * @date 04/05/2007
	 * @return Collection with the subprograms
	 * @throws java.sql.SQLException
	 */
	public Collection findSubProgramaSinVigencia(SubProgramaVO criterea,
			Long codeUser, String groupUserName, Long areaUser)
			throws SQLException {
		String query = "SELECT DISTINCT COD_SUBPRO,  NOM_SUBPRO,  DESC_SUBPRO, "
				+ "DREU_SUBPRO,  GRFAM_SUBPRO, VCR_SUBPRO, "
				+ " VCS_SUBPRO, DIROBL_SUBPRO, VALOR_SUBPRO, "
				+ " DESDE_SUBPRO, HASTA_SUBPRO, VIGENCIA_SUBPRO,COD_PROGRAMA, "
				+ "NOM_PROGRAMA, COD_USUARIO, NOM_USUARIO, "
				+ "COD_CATEGORIA,  NOM_CATEGORIA, cod_area, cod_area_prog "
				+ "FROM VCS_BEN_SOLO_SUBPROGRAMAS ";

		if ((Object) codeUser != null) {
			query += " where ( 'ADMINISTRADOR GENERAL' = '" + groupUserName
					+ "' OR 'SUPER USUARIO' = '" + groupUserName
					+ "' or admSubpro = " + codeUser
					+ "          or admProg = " + codeUser;
			if (groupUserName != null
					&& groupUserName.equals("ADMINISTRADOR SECRETARIA")) {
				query += " or cod_area_prog = " + areaUser;
			}
			query += " ) ";
		} else
			return null;

		if (criterea.getCode() != null) {
			query += " AND COD_SUBPRO = " + criterea.getCode() + " ";
		}
		if (!criterea.getNombre().equalsIgnoreCase("")) {
			query += " AND NOM_SUBPRO LIKE '%"
					+ criterea.getNombre().toUpperCase().trim() + "%' ";
		}
		if (criterea.getCodePrograma() != null) {
			query += " AND COD_PROGRAMA = " + criterea.getCodePrograma() + " ";
		}
		if (criterea.getCodeArea() != null) {
			query += " AND (cod_area = " + criterea.getCodeArea()
					+ " or cod_area_prog = " + criterea.getCodeArea() + ") ";
		}
		query += " ORDER BY NOM_SUBPRO";

		// System.out.println(query);
		ResultSet rst = null;
		ArrayList subprogramas = new ArrayList();
		rst = cf.getRecordsRset(query, null, conn);
		SubProgramaVO subpro = null;
		while (rst.next()) {
			subpro = new SubProgramaVO();
			subpro.setCode(new Long(rst.getLong("COD_SUBPRO")));
			subpro.setNombre(rst.getString("NOM_SUBPRO"));
			subpro.setDescripcion(rst.getString("DESC_SUBPRO"));
			subpro.setDiasReutilizar(rst.getString("DREU_SUBPRO"));
			subpro.setGrupoFamiliar(rst.getString("GRFAM_SUBPRO"));
			subpro.setValidarEstud(rst.getString("VCR_SUBPRO"));
			subpro.setValidarSisben(rst.getString("VCS_SUBPRO"));
			subpro.setDirBenObligatoria(rst.getString("DIROBL_SUBPRO"));
			subpro.setValorUnitarioBeneficio(rst.getString("VALOR_SUBPRO"));
			subpro.setDesdeVigencia(rst.getString("DESDE_SUBPRO"));
			subpro.setHastaVigencia(rst.getString("HASTA_SUBPRO"));
			subpro.setVigencia(rst.getString("VIGENCIA_SUBPRO"));
			subpro.setCodePrograma(new Long(rst.getLong("COD_PROGRAMA")));
			subpro.setNombrePrograma(rst.getString("NOM_PROGRAMA"));
			subpro.setCodeUsuario(new Long(rst.getLong("COD_USUARIO")));
			subpro.setNombreUsuario(rst.getString("NOM_USUARIO"));
			subpro.setCodeCategoria(new Long(rst.getLong("COD_CATEGORIA")));
			subpro.setDescCategoria(rst.getString("NOM_CATEGORIA"));
			subprogramas.add(subpro);
			subpro = null;
		}
		rst.close();
		return subprogramas;
	}

	public Collection findAllowedSubPrograma(SubProgramaVO criterea,
			Long codeUser, String groupUserName, Long areaUser)
			throws SQLException {
		String query = "SELECT DISTINCT CODIGO,  NOMBRE,  DESCRIPCION, DIAS_REUTILIZAR,  "
				+ "GRUPO_FAMILIAR, VALIDAR_CONTRA_ESTUD,  VALIDAR_CONTRA_SISBEN, "
				+ "DIRECCION_BEN_OBLIGATORIA, nvl(VALOR_UNITARIO_BENEFICIO,0) VALOR_UNITARIO_BENEFICIO, DESDE_VIGENCIA, "
				+ "HASTA_VIGENCIA, VIGENCIA,COD_PROGRAMA, NOM_PROGRAMA, COD_CATEGORIA,  "
				+ "NOM_CATEGORIA, COD_AREA " + "FROM VCS_BEN_SUBPROG_ALLOWED a";

		if ((Object) codeUser != null) {
			query += " where ( 'ADMINISTRADOR GENERAL' = '" + groupUserName
					+ "' OR 'SUPER USUARIO' = '" + groupUserName
					+ "' or admSubpro = " + codeUser
					+ "          OR admProg = " + codeUser
					+ " OR a.permisos = " + codeUser + " ";
			if (groupUserName != null
					&& groupUserName.equals("ADMINISTRADOR SECRETARIA")) {
				query += " OR cod_area = " + areaUser;
			}
			query += " ) ";
		} else
			return null;

		if (criterea.getCode() != null) {
			query += " AND CODIGO = " + criterea.getCode() + " ";
		}
		if (!criterea.getNombre().equalsIgnoreCase("")) {
			query += " AND NOMBRE LIKE '%"
					+ criterea.getNombre().toUpperCase().trim() + "%' ";
		}
		if (criterea.getCodePrograma() != null) {
			query += " AND COD_PROGRAMA = " + criterea.getCodePrograma() + " ";
		}
		if (criterea.getCodeArea() != null) {
			query += " AND (cod_area = " + criterea.getCodeArea() + ") ";
		}
		query += " AND a.VIGENCIA = 'A' ORDER BY NOMBRE";

		// System.out.println(query);
		ResultSet rst = null;
		ArrayList subprogramas = new ArrayList();
		rst = cf.getRecordsRset(query, null, conn);
		SubProgramaVO subpro = null;
		while (rst.next()) {
			subpro = new SubProgramaVO();
			subpro.setCode(new Long(rst.getLong("CODIGO")));
			subpro.setNombre(rst.getString("NOMBRE"));
			subpro.setDescripcion(rst.getString("DESCRIPCION"));
			subpro.setDiasReutilizar(rst.getString("DIAS_REUTILIZAR"));
			subpro.setGrupoFamiliar(rst.getString("GRUPO_FAMILIAR"));
			subpro.setValidarEstud(rst.getString("VALIDAR_CONTRA_ESTUD"));
			subpro.setValidarSisben(rst.getString("VALIDAR_CONTRA_SISBEN"));
			subpro.setDirBenObligatoria(rst
					.getString("DIRECCION_BEN_OBLIGATORIA"));
			subpro.setValorUnitarioBeneficio(rst
					.getString("VALOR_UNITARIO_BENEFICIO"));
			subpro.setDesdeVigencia(rst.getString("DESDE_VIGENCIA"));
			subpro.setHastaVigencia(rst.getString("HASTA_VIGENCIA"));
			subpro.setVigencia(rst.getString("VIGENCIA"));
			subpro.setCodePrograma(new Long(rst.getLong("COD_PROGRAMA")));
			subpro.setNombrePrograma(rst.getString("NOM_PROGRAMA"));
			subpro.setCodeCategoria(new Long(rst.getLong("COD_CATEGORIA")));
			subpro.setDescCategoria(rst.getString("NOM_CATEGORIA"));
			subprogramas.add(subpro);
			subpro = null;
		}
		rst.close();
		return subprogramas;
	}

	// public Collection findBeneficioByCriterea(SubProgramaVO criterea, Long
	// codeUser, Long codeGroupUser) throws SQLException
	// {
	// String query =
	// "select DISTINCT CODIGO,NOMBRE,DESCRIPCION,DIAS_REUTILIZAR,GRUPO_FAMILIAR, "+
	// "VALIDAR_CONTRA_ESTUD,VALIDAR_CONTRA_SISBEN,DIRECCION_BEN_OBLIGATORIA,VALOR_UNITARIO_BENEFICIO, "+
	// "DESDE_VIGENCIA,HASTA_VIGENCIA,VIGENCIA,COD_PROGRAMA, NOM_PROGRAMA,"+
	// "COD_USUARIO,NOM_USUARIO,COD_CATEGORIA, NOM_CATEGORIA "+
	// "from VCS_BEN_SUBPROGRAMAS ";
	//
	// if((Object)codeUser != null)
	// {
	// query
	// +=" where (ususede = "+codeUser+" OR 33 = "+codeGroupUser+" OR 128 = "+codeGroupUser+") ";
	// }else return null;
	//
	// if(criterea.getCode() != null)
	// {
	// query += " AND CODIGO = "+criterea.getCode()+" ";
	// }
	// if(!criterea.getNombre().equalsIgnoreCase(""))
	// {
	// query +=
	// " AND NOMBRE LIKE '%"+criterea.getNombre().toUpperCase().trim()+"%' ";
	// }
	// if(criterea.getCodePrograma() != null)
	// {
	// query += " AND COD_PROGRAMA = "+criterea.getCodePrograma()+" ";
	// }
	// if (criterea.getCodeArea() != null)
	// {
	// query += " AND AREA_CODIGO = "+criterea.getCodeArea()+" ";
	// }
	// query += "ORDER BY NOMBRE";
	//
	// //System.out.println(query);
	// ResultSet rst = null;
	// ArrayList subprogramas = new ArrayList();
	// rst = cf.getRecordsRset(query,null,conn);
	// SubProgramaVO subpro = null;
	// while ( rst.next() )
	// {
	// subpro = new SubProgramaVO();
	// subpro.setCode(new Long(rst.getLong( "CODIGO")));
	// subpro.setNombre(rst.getString( "NOMBRE"));
	// subpro.setDescripcion(rst.getString("DESCRIPCION"));
	// subpro.setDiasReutilizar(rst.getString("DIAS_REUTILIZAR"));
	// subpro.setGrupoFamiliar(rst.getString("GRUPO_FAMILIAR"));
	// subpro.setValidarEstud(rst.getString("VALIDAR_CONTRA_ESTUD"));
	// subpro.setValidarSisben(rst.getString("VALIDAR_CONTRA_SISBEN"));
	// subpro.setDirBenObligatoria(rst.getString("DIRECCION_BEN_OBLIGATORIA"));
	// subpro.setValorUnitarioBeneficio(rst.getString("VALOR_UNITARIO_BENEFICIO"));
	// subpro.setDesdeVigencia(rst.getString("DESDE_VIGENCIA"));
	// subpro.setHastaVigencia(rst.getString("HASTA_VIGENCIA"));
	// subpro.setVigencia(rst.getString("VIGENCIA"));
	// subpro.setCodePrograma(new Long(rst.getLong("COD_PROGRAMA")));
	// subpro.setNombrePrograma(rst.getString("NOM_PROGRAMA"));
	// subpro.setCodeUsuario(new Long(rst.getLong("COD_USUARIO")));
	// subpro.setNombreUsuario(rst.getString("NOM_USUARIO"));
	// subpro.setCodeCategoria(new Long(rst.getLong("COD_CATEGORIA")));
	// subpro.setDescCategoria(rst.getString("NOM_CATEGORIA"));
	// subprogramas.add(subpro);
	// subpro=null;
	// }
	// rst.close();
	// return subprogramas;
	// }

	// public Collection findSubProgramaByUser(Long codeUser, String nameGus,
	// SubProgramaVO criterea) throws SQLException
	// {
	// String query =
	// "select subpro.codigo codeSubprograma, upper(subpro.nombre) nomSubprograma "+
	// "from tcs_ben_subprograma subpro, "+
	// " tcs_ben_area area, TCS_BEN_PROGRAMA pro, "+
	// "paoyer.tcs_usuario usu, "+
	// "paoyer.tcs_grupo_usuario gus "+
	// "where subpro.USU_CODIGO = usu.CODIGO "+
	// " and area.CODIGO = subpro.AREA_CODIGO "+
	// " AND pro.codigo = subpro.PRG_CODIGO "+
	// "and Fcs_Ben_Val_Vigencia(subpro.VIGENCIA, subpro.DESDE_VIGENCIA, subpro.HASTA_VIGENCIA, sysdate) = 'A' "+
	// " and gus.DESCRIPCION = '"+nameGus+"' ";
	// ArrayList subprogramas = new ArrayList();
	// if(!nameGus.equalsIgnoreCase("") && codeUser != null)
	// {
	// query +=
	// " and ('"+nameGus+"' = 'ADMINISTRADOR GENERAL' or '"+nameGus+"' = 'SUPER USUARIO' or subpro.usu_codigo = "+codeUser+" OR pro.usu_codigo ="+codeUser+") ";
	//
	// if(criterea.getCodePrograma() != null)
	// {
	// query += " and subpro.PRG_CODIGO = "+criterea.getCodePrograma();
	// }
	//
	// if(!criterea.getNombre().equalsIgnoreCase(""))
	// {
	// query +=
	// "AND subpro.NOMBRE LIKE UPPER('%"+criterea.getNombre().trim()+"%') ";
	// }
	// if(criterea.getCodeArea() != null)
	// {
	// query += "AND area.AREA_CODIGO = "+criterea.getCodeArea();
	// }
	//
	//
	// query += "order by subpro.nombre";
	// ResultSet rst = null;
	// //System.out.println(query);
	// rst = cf.getRecordsRset(query,null,conn);
	// SubProgramaVO subpro = null;
	// while ( rst.next() )
	// {
	// subpro = new SubProgramaVO();
	// subpro.setCode(new Long(rst.getLong( "codeSubprograma")));
	// subpro.setNombre(rst.getString( "nomSubprograma"));
	// subprogramas.add(subpro);
	// subpro=null;
	// }
	// rst.close();
	// }
	// return subprogramas;
	// }

	public Connection getConn() {
		return conn;
	}

	/**
	 * Autor Felipe R. Modificacion
	 * 
	 * @param strArr
	 * @return
	 * @throws java.sql.SQLException
	 */
	public int InsetBeneficioOtorgado(String strArr[], int i, String DateBenefit)
			throws SQLException {

		String fecha = "select to_char((select to_date('" + DateBenefit
				+ "','dd/mm/RRRR') from dual)+" + i
				+ ",'dd/mm/RRRR') fecha from dual ";
		ResultSet rs = cf.getRecordsRset(fecha, null, conn);
		if (rs.next()) {
			fecha = rs.getString("fecha");
		} else {
			fecha = "sysdate";
		}
		String strSql = "INSERT INTO TCS_BEN_BENEFICIO_OTORGADO (CODIGO, SBPR_CODIGO, "
				+ "BEN_CODIGO, SEDE_CODIGO, TERCERO, FECHA_BENEFICIO, CAMPO_F1, VALOR_BENEFICIO, TIPO_BENEFICIO, "
				+ "USUARIO_CREA, TERMINAL_CREA, USUARIO_MODIFICA, TERMINAL_MODIFICA) "
				+ " VALUES(SCS_BEN_BOT.NEXTVAL,?,?,?,?,to_date('"
				+ fecha
				+ "','dd/mm/RRRR'),to_date(sysdate,'dd/mm/RRRR'),?,?,?,?,?,?)";
		// System.out.println(strSql);
		int bInsertoCorrectamente = cf.execSql(strSql, strArr, conn);
		return bInsertoCorrectamente;

	}

	public int updateBeneficioOtorgado(String strArr[], int i,
			String DateBenefit, String codeBot) throws SQLException {
		String fecha = "select to_char((select to_date('" + DateBenefit
				+ "','dd/mm/RRRR') from dual)+" + i
				+ ",'dd/mm/RRRR') fecha from dual ";
		ResultSet rs = cf.getRecordsRset(fecha, null, conn);
		if (rs.next()) {
			fecha = rs.getString("fecha");
		} else {
			fecha = "sysdate";
		}

		String strSql = "{call PCS_BEN_UPDATE_BOT(" + strArr[0] + ", '"
				+ strArr[1] + "', '" + fecha + "', " + "" + strArr[2] + ",'"
				+ strArr[3] + "', '" + strArr[4] + "', " + codeBot + ", ?)}";
		CallableStatement cs = null;
		cs = conn.prepareCall(strSql);

		cs.registerOutParameter(1, Types.INTEGER);
		cs.execute();

		return cs.getInt(1);
	}

	/**
	 * Autor Andres Cespedes
	 * 
	 * @param strArr
	 * @param i
	 * @param DateBenefit
	 * @param codeBot
	 * @param tipoBot
	 *            tipo de beneficio, atributo muy usado por los programas de la
	 *            secretaria de la mujer.
	 * @return
	 * @throws SQLException
	 */
	public int updateBeneficioOtorgado(String strArr[], int i,
			String DateBenefit, String codeBot, String tipoBot)
			throws SQLException {
		String fecha = "select to_char((select to_date('" + DateBenefit
				+ "','dd/mm/RRRR') from dual)+" + i
				+ ",'dd/mm/RRRR') fecha from dual ";
		ResultSet rs = cf.getRecordsRset(fecha, null, conn);
		if (rs.next()) {
			fecha = rs.getString("fecha");
		} else {
			fecha = "sysdate";
		}

		String strSql = "{call PCS_BEN_UPDATE_BOT_NEWTP(" + strArr[0] + ", '"
				+ strArr[1] + "', '" + fecha + "', " + "" + strArr[2] + ",'"
				+ tipoBot + "','" + strArr[3] + "', '" + strArr[4] + "', "
				+ codeBot + ", ?)}";
		CallableStatement cs = null;
		cs = conn.prepareCall(strSql);

		cs.registerOutParameter(1, Types.INTEGER);
		cs.execute();

		return cs.getInt(1);
	}

	/**
	 * Autor Felipe R.
	 * 
	 * @param codeSubpro
	 * @return
	 * @throws java.sql.SQLException
	 */
	public SubProgramaVO GetPropiedadesSubpro(Long codeSubpro)
			throws SQLException {
		String query = "SELECT DIAS_REUTILIZAR,CAMPO_A3 FROM TCS_BEN_SUBPROGRAMA WHERE CODIGO ="
				+ codeSubpro + "";

		ResultSet rst = null;
		rst = cf.getRecordsRset(query, null, conn);
		SubProgramaVO subpro = null;
		if (rst.next()) {
			subpro = new SubProgramaVO();

			subpro.setDiasReutilizar(rst.getString("DIAS_REUTILIZAR"));
			subpro.setDiasRenovacion(rst.getString("CAMPO_A3"));
		}
		rst.close();
		return subpro;
	}

	public String CodMaxBenOtor() throws SQLException {

		String codigo = "";
		String strSql = "SELECT SCS_BEN_BOT.currval CODEMAX FROM dual";
		ResultSet rst = null;
		rst = cf.getRecordsRset(strSql, null, conn);

		while (rst.next()) {
			codigo = rst.getString("CODEMAX");

		}
		return codigo;

	}

	public String getCantidadDisponible() throws SQLException {

		String codigo = "";
		String strSql = "SELECT MAX(CODIGO) CODEMAX FROM TCS_BEN_BENEFICIO_OTORGADO";
		ResultSet rst = null;
		rst = cf.getRecordsRset(strSql, null, conn);

		while (rst.next()) {
			codigo = rst.getString("CODEMAX");

		}
		return codigo;

	}

	public String getMaxCode() throws SQLException {
		String codigo = "";
		String strSql = "Select max(codigo) max_codigo from tcs_ben_subprograma";
		ResultSet rst = null;
		rst = cf.getRecordsRset(strSql, null, conn);
		if (rst.next()) {
			codigo = rst.getString("max_codigo");
		}
		return codigo;

	}

	public int InsertBeneficio(SubprogramaForm subform, String user,
			String strTerminal, String strDate) throws SQLException {

		String query = " Insert into tcs_ben_subprograma (CODIGO, PRG_CODIGO, USU_CODIGO, "
				+ " NOMBRE, DESCRIPCION, DIAS_REUTILIZAR, GRUPO_FAMILIAR, "
				+ " VALIDAR_CONTRA_ESTUD, VALIDAR_CONTRA_SISBEN, VALOR_UNITARIO_BENEFICIO, "
				+ " DESDE_VIGENCIA, HASTA_VIGENCIA, VIGENCIA, AREA_CODIGO,CAMPO_A3, CAMPO_A1, "
				+ " usuario_crea, fecha_crea, terminal_crea, usuario_modifica, fecha_modifica, terminal_modifica) "
				+ " values (SCS_BEN_SBPR.NEXTVAL,?,?,upper(?),upper(?),?,?,?,?,?,to_date(?,'dd/mm/rrrr'),to_date(?,'dd/mm/rrrr'),'A',?,?,?,?,to_date(?,'dd/mm/rrrr'),?,?,to_date(?,'dd/mm/rrrr'),?) ";

		String Arr[] = { subform.getCodePrograma(), subform.getAdmincodigo1(),
				subform.getSubprograma().trim(), subform.getDescripcion(),
				subform.getDias(), subform.getGrupfam(), "N",
				subform.getSisben(), subform.getValor(), subform.getDesde(),
				subform.getHasta(), subform.getSubsecretaria(),
				subform.getDiasrenovar(), subform.getSolounavez(), user,
				strDate, strTerminal, user, strDate, strTerminal };

		int bInsertoCorrectamente = cf.execSql(query, Arr, conn);
		return bInsertoCorrectamente;

	}

	/**
	 * Autor DORIS
	 * 
	 * @param codeSubprograma
	 * @return
	 */

	public boolean getEstadoSubprograma(SubProgramaVO criterea) {

		String query = "select  codigo from tcs_ben_subprograma where  vigencia = 'I' and "
				+ " codigo = " + criterea.getCode();
		;

		ResultSet rst = null;

		try {
			rst = cf.getRecordsRset(query, null, conn);

			if (rst.next()) {
				return true;
			} else {
				return false;
			}

		} catch (Exception e) {
			System.err.println("/******** TDSUB - cwsub");
			e.printStackTrace();
			System.err.println("TDSUB - cwsub ********/");
			return false;
		}

	}

	/**
	 * Autor DORIS
	 * 
	 * @param codePrograma
	 * @return
	 */
	public Collection getActivarSub(ProgramaVO criterea) {

		String strSql = " SELECT sub.nombre nombre, sub.codigo codigo, prog.nombre nombrepro "
				+ " FROM TCS_BEN_SUBPROGRAMA sub, TCS_BEN_PROGRAMA prog "
				+ " WHERE (sub.vigencia <> 'A' OR SYSDATE > sub.HASTA_VIGENCIA) and sub.PRG_CODIGO = prog.CODIGO AND "
				+ " prog.codigo = " + criterea.getCodePrograma();

		ArrayList subprogramas = new ArrayList();
		try {
			ResultSet rst = cf.getRecordsRset(strSql, null, conn);
			SubProgramaVO subpro = null;
			while (rst.next()) {
				subpro = new SubProgramaVO();
				subpro.setCode(new Long(rst.getString("codigo")));
				subpro.setNombre(rst.getString("nombre"));
				subpro.setNombrePrograma(rst.getString("nombrepro"));
				subprogramas.add(subpro);
				subpro = null;
			}
			rst.close();
		} catch (SQLException e) {
			System.err.println("/******** TDSUB - cwsub");
			e.printStackTrace();
			System.err.println("TDSUB - cwsub ********/");
		}
		return subprogramas;

	}

	/**
	 * 
	 * @param criterea
	 *            bean with all data to filter the query.
	 * @param codeUser
	 *            code of the user at the moment connected
	 * @param groupUserName
	 *            Name of the user group
	 * @param areaUser
	 *            Code of the area to which the user belongs
	 * @notes This method returns all the subprograms to which a user has
	 *        permission, as long as they are disabled
	 * @author Carlos Ruiz & Daniel Monsalve
	 * @date 04/05/2007
	 * @return Collection with the subprograms
	 * @throws java.sql.SQLException
	 */
	public Collection getActivarSubprogramas2(Long codeUser,
			String groupUserName, Long areaUser) {

		String strSql = "SELECT * FROM VCS_BEN_SOLO_SUBPROGRAMAS ";
		if ((Object) codeUser != null) {
			strSql += " where ( 'ADMINISTRADOR GENERAL' = '" + groupUserName
					+ "' OR 'SUPER USUARIO' = '" + groupUserName
					+ "' or admSubpro = " + codeUser
					+ "          or admProg = " + codeUser;
			if (groupUserName != null
					&& groupUserName.equals("ADMINISTRADOR SECRETARIA")) {
				strSql += " or AREA_CODIGO = " + areaUser;
			}
			strSql += " ) ";
		}
		strSql += " and (VIGENCIA_SUBPRO = 'I' OR sysdate > HASTA_SUBPRO) ";
		ArrayList subprogramas = new ArrayList();

		try {
			ResultSet rst = cf.getRecordsRset(strSql, null, conn);
			SubProgramaVO subpro = null;
			while (rst.next()) {
				subpro = new SubProgramaVO();
				subpro.setCode(new Long(rst.getString("COD_SUBPRO")));
				subpro.setNombre(rst.getString("NOM_SUBPRO"));
				subpro.setNombrePrograma(rst.getString("NOM_PROGRAMA"));
				subprogramas.add(subpro);
				subpro = null;
			}
			rst.close();
		} catch (SQLException e) {
			System.err.println("/******** TDSUB - cwsub");
			e.printStackTrace();
			System.err.println("TDSUB - cwsub ********/");
		}
		return subprogramas;

	}

	public Collection getSubprogVigentes(SubProgramaVO criterea, Long codeUser,
			String groupUserName, Long areaUser) throws SQLException {
		/*
		 * String query =
		 * "SELECT DISTINCT COD_SUBPRO,  NOM_SUBPRO,  DESC_SUBPRO, "+
		 * "DREU_SUBPRO,  GRFAM_SUBPRO, VCR_SUBPRO, "+
		 * " VCS_SUBPRO, DIROBL_SUBPRO, VALOR_SUBPRO, "+
		 * " DESDE_SUBPRO, HASTA_SUBPRO, VIGENCIA_SUBPRO,COD_PROGRAMA, "+
		 * "NOM_PROGRAMA, COD_USUARIO, NOM_USUARIO, "+
		 * "COD_CATEGORIA,  NOM_CATEGORIA, cod_area, cod_area_prog "+
		 * "FROM VCS_BEN_SOLO_SUBPROG_EST_VIG ";
		 */
		String query = "SELECT DISTINCT CODIGO, NOMBRE, DESCRIPCION, "
				+ "DIAS_REUTILIZAR, GRUPO_FAMILIAR, VALIDAR_CONTRA_ESTUD, "
				+ "VALIDAR_CONTRA_SISBEN, DIRECCION_BEN_OBLIGATORIA, nvl(VALOR_UNITARIO_BENEFICIO,0) VALOR_UNITARIO_BENEFICIO, "
				+ "DESDE_VIGENCIA, HASTA_VIGENCIA, VIGENCIA,COD_PROGRAMA, "
				+ "NOM_PROGRAMA, COD_CATEGORIA,  NOM_CATEGORIA, AREA_CODIGO "
				+ "FROM VCS_BEN_SUBPROG_ALLOWED ";

		if ((Object) codeUser != null) {
			query += " where ( 'ADMINISTRADOR GENERAL' = '" + groupUserName
					+ "' OR 'SUPER USUARIO' = '" + groupUserName
					+ "' or admSubpro = " + codeUser
					+ "          or admProg = " + codeUser;
			if (groupUserName != null
					&& groupUserName.equals("ADMINISTRADOR SECRETARIA")) {
				query += " or AREA_CODIGO = " + areaUser;
			}
			query += " ) ";
		} else
			return null;

		if (criterea.getCode() != null) {
			query += " AND CODIGO = " + criterea.getCode() + " ";
		}

		if (criterea.getCodePrograma() != null
				&& criterea.getCodePrograma().longValue() != 0) {
			query += " AND COD_PROGRAMA = " + criterea.getCodePrograma() + " ";
		}
		if (areaUser != null && areaUser.longValue() != 0) {
			query += " AND (AREA_CODIGO = " + areaUser.longValue() + ") ";
		}

		query += " AND VIGENCIA <> 'I' " + " ORDER BY NOMBRE";

		// System.out.println(query);
		ResultSet rst = null;
		ArrayList subprogramas = new ArrayList();
		rst = cf.getRecordsRset(query, null, conn);
		SubProgramaVO subpro = null;
		while (rst.next()) {
			subpro = new SubProgramaVO();
			subpro.setCode(new Long(rst.getLong("CODIGO")));
			subpro.setNombre(rst.getString("NOMBRE"));
			subpro.setDescripcion(rst.getString("DESCRIPCION"));
			subpro.setDiasReutilizar(rst.getString("DIAS_REUTILIZAR"));
			subpro.setGrupoFamiliar(rst.getString("GRUPO_FAMILIAR"));
			subpro.setValidarEstud(rst.getString("VALIDAR_CONTRA_ESTUD"));
			subpro.setValidarSisben(rst.getString("VALIDAR_CONTRA_SISBEN"));
			subpro.setDirBenObligatoria(rst
					.getString("DIRECCION_BEN_OBLIGATORIA"));
			subpro.setValorUnitarioBeneficio(rst
					.getString("VALOR_UNITARIO_BENEFICIO"));
			subpro.setDesdeVigencia(rst.getString("DESDE_VIGENCIA"));
			subpro.setHastaVigencia(rst.getString("HASTA_VIGENCIA"));
			subpro.setVigencia(rst.getString("VIGENCIA"));
			subpro.setCodePrograma(new Long(rst.getLong("COD_PROGRAMA")));
			subpro.setNombrePrograma(rst.getString("NOM_PROGRAMA"));
			subpro.setCodeCategoria(new Long(rst.getLong("COD_CATEGORIA")));
			subpro.setDescCategoria(rst.getString("NOM_CATEGORIA"));
			subprogramas.add(subpro);
			subpro = null;
		}
		rst.close();
		return subprogramas;
	}

	public String getNameByCode(String strCodeSub) throws SQLException {
		String query = "SELECT nombre FROM tcs_ben_subprograma "
				+ "WHERE codigo = " + strCodeSub;

		String strName = null;
		ResultSet rst = null;
		rst = cf.getRecordsRset(query, null, conn);
		if (rst.next()) {
			strName = rst.getString("nombre");
		}
		rst.close();
		return strName;
	}

	// Metodo para obtener el codigo del subprograma a partir del codigo del
	// beneficio otorgado

	public String getCodeSubBOT(String codeBOT) throws SQLException {
		String query = " SELECT SBPR_CODIGO "
				+ " FROM TCS_BEN_BENEFICIO_OTORGADO " + " WHERE codigo ="
				+ codeBOT;

		ResultSet rst = null;
		rst = cf.getRecordsRset(query, null, conn);

		rst.next();

		return rst.getString("SBPR_CODIGO");
	}

	public boolean isRelatedWithSede(String codeSub) throws SQLException {
		String query = " SELECT COUNT(DISTINCT CODIGO) Cantidad "
				+ " FROM VCS_BEN_SUBPROGRAMAS" + " WHERE CODIGO = " + codeSub;

		ResultSet rst = null;
		rst = cf.getRecordsRset(query, null, conn);

		rst.next();

		if (rst.getInt("Cantidad") == 0) {
			return false;
		} else {
			return true;
		}
	}

	public String getPrograma(String codeSubprograma) throws SQLException {
		String strSql = "SELECT PRG_CODIGO " + " FROM TCS_BEN_SUBPROGRAMA "
				+ " WHERE CODIGO =" + codeSubprograma;

		ResultSet rst = null;
		rst = cf.getRecordsRset(strSql, null, conn);

		rst.next();

		return rst.getString("PRG_CODIGO");
	}
}